package com.meichuang.meipian.video.util;

import android.content.Context;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

//import org.apache.http.util.EncodingUtils;

public class FileUtil {
	// String Name = File.getName(); //获得文件或文件夹的名称：
	// String parentPath = File.getParent(); //获得文件或文件夹的父目录
	// String path = File.getAbsoultePath();//绝对路经
	// String path = File.getPath();//相对路经
	// File.createNewFile();//建立文件
	// File.mkDir(); //建立文件夹
	// File.isDirectory(); //判断是文件或文件夹
	// File[] files = File.listFiles(); //列出文件夹下的所有文件和文件夹名
	// File.renameTo(dest); //修改文件夹和文件名
	// File.delete(); //删除文件夹或文件

	/**
	 *  从assets目录中复制整个文件夹内容
	 *  @param  context  Context 使用CopyFiles类的Activity
	 *  @param  oldPath  String  原文件路径  如：/aa
	 *  @param  newPath  String  复制后路径  如：xx:/bb/cc
	 */
	public static void copyFilesFassets(Context context, String oldPath, String newPath) {
		try {
			String fileNames[] = context.getAssets().list(oldPath);//获取assets目录下的所有文件及目录名
			if (fileNames.length > 0) {//如果是目录
				File file = new File(newPath);
				file.mkdirs();//如果文件夹不存在，则递归
				for (String fileName : fileNames) {
					copyFilesFassets(context,oldPath + "/" + fileName,newPath+"/"+fileName);
				}
			} else {//如果是文件
				InputStream is = context.getAssets().open(oldPath);
				FileOutputStream fos = new FileOutputStream(new File(newPath));
				byte[] buffer = new byte[1024];
				int byteCount=0;
				while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节
					fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流
				}
				fos.flush();//刷新缓冲区
				is.close();
				fos.close();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			//如果捕捉到错误则通知UI线程
//			MainActivity.handler.sendEmptyMessage(COPY_FALSE);
		}
	}

	public static boolean isCheckFileIsHave(String name) {// 检查是否有某个文件 没有创建
		File file = new File(name);
//		Log.w("wlb","isCheckFileIsHave name  "+name);
		if (file.exists()) {
			return true;
		} else {
			boolean b = false;
			try {
//				Log.w("wlb","isCheckFileIsHave creat name  "+name);
				b = file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return b;
		}
	}
	public static boolean isCheckFileIsHaveNoCreat(String name) {// 检查是否有某个文件 没有不创建
		File file = new File(name);
//		Log.w("wlb","isCheckFileIsHave name  "+name);
		if (file.exists()) {
			if(file.length()==0){
				file.delete();
//				Log.w("wlb"," name "+name+" length "+file.length());
				return false;
			}
//			Log.w("wlb"," name "+name+" length "+file.length());
//			Log.w("wlb","  "+file.length());
			return true;
		}
		return false;
	}
	public static boolean isCheckFolderIsHave(String name) {// 检查是否有某个文件夹，没有则创建
		File file = new File(name);
//		Log.w("wlb","isCheckFolderIsHave name  "+name);
		if (file.exists()) {
			return true;
		} else {
//			Log.w("wlb","isCheckFolderIsHave creat name  "+name);
			boolean b = false;
			b = file.mkdir();
			return b;
		}
	}

	// 从资源文件中读取文件
	public static String readResRawFile(Context context, int resId) {
		String res = "";
		try {
			InputStream in = context.getResources().openRawResource(resId);

			// 得到数据的大小
			int length = in.available();

			byte[] buffer = new byte[length];

			// 读取数据
			in.read(buffer);

			// 依test.txt的编码类型选择合适的编码，如果不调整会乱码
//			res = EncodingUtils.getString(buffer, "UTF-8");

			// 关闭
			in.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}

	// 从resource的asset中读取文件数据
	public static String readResAssetFile(Context context, String fileName) {
		String res = "";
		try {
			InputStream in = context.getResources().getAssets().open(fileName);

			int length = in.available();
			byte[] buffer = new byte[length];

			in.read(buffer);
			in.close();
//			res = EncodingUtils.getString(buffer, "UTF-8");

		} catch (Exception e) {

			e.printStackTrace();

		}
		return res;
	}

	// 从resource的asset中读取文件数据
	public static boolean copeAssetFileToSDFile(Context context, String fileName, String destFile) {
		String res = "";
		try {
			InputStream in = context.getResources().getAssets().open(fileName);

			int length = in.available();
			byte[] buffer = new byte[length];

			in.read(buffer);
			in.close();
//			res = EncodingUtils.getString(buffer, "UTF-8");

		} catch (Exception e) {

			e.printStackTrace();

		}

		try{
			InputStream streamFrom = context.getResources().getAssets().open(fileName);
			OutputStream streamTo = new FileOutputStream(destFile);
			byte buffer[]=new byte[1024];
			int len;
			while ((len= streamFrom.read(buffer)) > 0){
				streamTo.write(buffer, 0, len);
			}
			streamFrom.close();
			streamTo.close();
			return true;
		} catch(Exception ex){
			return false;
		}
	}
	// 读写SD卡中的文件。也就是/mnt/sdcard/目录下面的文件 ：
	// 写数据到SD中的文件
	public static void writeFileSdcardFile(String fileName, String write_str) {
		try {

			FileOutputStream fout = new FileOutputStream(fileName);
			byte[] bytes = write_str.getBytes();

			fout.write(bytes);
			fout.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 读SD中的文件
	public static String readFileSdcardFile(String fileName) {
		String res = "";
		try {
			FileInputStream fin = new FileInputStream(fileName);

			int length = fin.available();

			byte[] buffer = new byte[length];
			fin.read(buffer);

//			res = EncodingUtils.getString(buffer, "UTF-8");

			fin.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return res;
	}
	public static void deleteFile(String fileName){
		try{
			File file = new File(fileName);
			file.delete();
		}catch(Exception e){
			e.printStackTrace();
		}

	}
	public static void deleteAllFiles(File root) {
		File files[] = root.listFiles();
		if (files != null)
			for (File f : files) {
				if (f.isDirectory()) { // 判断是否为文件夹
					deleteAllFiles(f);
					try {
						f.delete();
					} catch (Exception e) {
					}
				} else {
					if (f.exists()) { // 判断是否存在
						deleteAllFiles(f);
						try {
							f.delete();
						} catch (Exception e) {
						}
					}
				}
			}
	}

	public static File getTrimmedVideoPath(Context context) {
		File file = context.getExternalCacheDir();

		return file;
	}

	public static File getappCatch(Context context) {
//		File file = new File("data/data/com.android.jianying/catch");
		return context.getCacheDir();
	}
	public static String getString(InputStream inputStream) {
		InputStreamReader inputStreamReader = null;
		try {
			inputStreamReader = new InputStreamReader(inputStream, "utf-8");
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		BufferedReader reader = new BufferedReader(inputStreamReader);
		StringBuilder sb = new StringBuilder("");
		String line;
		try {
			while ((line = reader.readLine()) != null) {
				sb.append(line);
				sb.append("\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			inputStream.close();
			inputStreamReader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}


		return sb.toString();
	}
	// 使用File类进行文件的读写：
	// 读文件
	public static String readSDFile(String fileName) {
		String res = "";
		try {
			File file = new File(fileName);

			FileInputStream fis = new FileInputStream(file);

//			int length = fis.available();
//
//			byte[] buffer = new byte[length];
//			fis.read(buffer);
			res = getString(fis);
//			res = EncodingUtils.getString(buffer, "UTF-8");

			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return res;
	}


	// public long skip (long byteCount); //从数据流中跳过n个字节
	// public int read (byte[] buffer, int offset, int length);
	// //从数据流中读取length数据存在buffer的offset开始的位置。offset是相对于buffer的开始位置的，不是数据流。

	// 写文件
	public static void writeSDFile(String fileName, String write_str) {
		try {
			File file = new File(fileName);

			FileOutputStream fos = new FileOutputStream(file);

			byte[] bytes = write_str.getBytes();

			fos.write(bytes);

			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// //读写/data/data/<应用程序名>目录上的文件:
	// //写数据
	// public void writeFile(String fileName,String writestr){
	// try{
	// FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);
	//
	// byte [] bytes = writestr.getBytes();
	//
	// fout.write(bytes);
	//
	// fout.close();
	// }
	//
	// catch(Exception e){
	// e.printStackTrace();
	// }
	// }
	//
	// //读数据
	// public String readFile(String fileName){
	// String res="";
	// try{
	// FileInputStream fin = openFileInput(fileName);
	// int length = fin.available();
	// byte [] buffer = new byte[length];
	// fin.read(buffer);
	// res = EncodingUtils.getString(buffer, "UTF-8");
	// fin.close();
	// }
	// catch(Exception e){
	// e.printStackTrace();
	// }
	// return res;
	//
	// }
	/**
	 * 复制文件目录
	 * @param srcDir 要复制的源目录 eg:/mnt/sdcard/DB
	 * @param destDir 复制到的目标目录 eg:/mnt/sdcard/db/
	 * @return
	 */
	public static boolean copyDir(String srcDir, String destDir){
		File sourceDir = new File(srcDir);
		//判断文件目录是否存在
		if(!sourceDir.exists()){
			return false;
		}
		//判断是否是目录
		if (sourceDir.isDirectory()) {
			File[] fileList = sourceDir.listFiles();
			File targetDir = new File(destDir);
			//创建目标目录
			if(!targetDir.exists()){
				targetDir.mkdirs();
			}
			//遍历要复制该目录下的全部文件
			for(int i= 0;i<fileList.length;i++){
				if(fileList[i].isDirectory()){//如果如果是子目录进行递归
					copyDir(fileList[i].getPath()+ "/",
							destDir + fileList[i].getName() + "/");
				}else{//如果是文件则进行文件拷贝
					copyFile(fileList[i].getPath(), destDir +fileList[i].getName());
				}
			}
			return true;
		}else {
			copyFileToDir(srcDir,destDir);
			return true;
		}
	}


	/**
	 * 复制文件（非目录）
	 * @param srcFile 要复制的源文件
	 * @param destFile 复制到的目标文件
	 * @return
	 */
	public static boolean copyFile(String srcFile, String destFile){
		try{
			InputStream streamFrom = new FileInputStream(srcFile);
			OutputStream streamTo = new FileOutputStream(destFile);
			byte buffer[]=new byte[1024];
			int len;
			while ((len= streamFrom.read(buffer)) > 0){
				streamTo.write(buffer, 0, len);
			}
			streamFrom.close();
			streamTo.close();
			return true;
		} catch(Exception ex){
			return false;
		}
	}


	/**
	 * 把文件拷贝到某一目录下
	 * @param srcFile
	 * @param destDir
	 * @return
	 */
	public static boolean copyFileToDir(String srcFile, String destDir){
		File fileDir = new File(destDir);
		if (!fileDir.exists()) {
			fileDir.mkdir();
		}
		String destFile = destDir +"/" + new File(srcFile).getName();
		try{
			InputStream streamFrom = new FileInputStream(srcFile);
			OutputStream streamTo = new FileOutputStream(destFile);
			byte buffer[]=new byte[1024];
			int len;
			while ((len= streamFrom.read(buffer)) > 0){
				streamTo.write(buffer, 0, len);
			}
			streamFrom.close();
			streamTo.close();
			return true;
		} catch(Exception ex){
			return false;
		}
	}


	/**
	 * 移动文件目录到某一路径下
	 * @param srcFile
	 * @param destDir
	 * @return
	 */
	public static boolean moveFile(String srcFile, String destDir) {
		//复制后删除原目录
		if (copyDir(srcFile, destDir)) {
			deleteFile(new File(srcFile));
			return true;
		}
		return false;
	}

	/**
	 * 删除文件（包括目录）
	 * @param delFile
	 */
	public static void deleteFile(File delFile) {
		//如果是目录递归删除
		if (delFile.isDirectory()) {
			File[] files = delFile.listFiles();
			for (File file : files) {
				deleteFile(file);
			}
		}else{
			delFile.delete();
		}
		//如果不执行下面这句，目录下所有文件都删除了，但是还剩下子目录空文件夹
		delFile.delete();
	}


}
